package com.tedu.api.io;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**包位置：java.io
 * RandomAccessFile
 * 专门解决File无法实现读写的操作类【数据传输】，底层使用C完成
 * 【使用方法不方便】----知道
 * RandomAccessFile构造器使用
 * new RandomAccessFile("文件路径","r代表读,rw代表读写");
 * RandomAccessFile方法的使用：读写操作
 * 需求：实现音乐  C  v    复制  粘贴
 */
public class RandomAccessFileAPI {
    @Test
    public void testWrite() throws IOException {
        //创建RAF类:  在API    项目文件夹下  直接创建raf.txt文件  模式：读写
        RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
/**
 * write()
 * 作用：写出一个字节，将给定的int值对应的2进制的"第8位"写出
 * 该方法有异常，范围：0~255之间----写入ASCII码【接近底层】
 * 出现异常，抛出IO异常---有可能存在文件无法写出的情况
 */
        raf.write(97);//a
        raf.write(98);//b
        raf.write(101);//e
        //关闭  流  closed()
        raf.close();



    }


    @Test
    public void testRead() throws IOException {
        //创建RAF类---模式：
        RandomAccessFile raf=new RandomAccessFile("raf.txt","r");
        /**
         * read()
         * 作用：读取一个字节，返回10进制值，如果返回值-1，代表读取末尾
         * 抛出IO异常
         */
        int a=raf.read();
        int b=raf.read();  int e=raf.read();
        int c=raf.read();
        System.out.println("读取到："+a+" "+b+" "+e+" "+c);
    }

    //需求：实现音乐C V 复制粘贴
    @Test
    public void testCopy() throws IOException {
     //1.被复制的文件---复制操作----模式：r
        RandomAccessFile src=new RandomAccessFile("大学生讲思政课.mp4","r") ;
     //1.复制出来的新文件--- 粘贴操作---模式：rw
        RandomAccessFile desc=new RandomAccessFile("大学生讲思政课复制品.mp4","rw") ;

        //2.创建变量类型：int类型---①用于保存读取/写出的每个字节
        int temp=-1;//读取：②读到-1代表文件数据读完了
      //5.【一个字节一个字节的读---一个字节一个字节的写】  测运行效率
        long start=System.currentTimeMillis();//获取系统时间：毫秒数
        //3.从“小跳蛙.mp3”--读到每个字节--写出"新跳蛙.mp3"
        //思考：一直从“小跳蛙.mp3”读到所有字节
        //从“小跳蛙.mp3”读到所有字节,只要不是末尾   ！=-1  一直读
        while((temp=src.read())!=-1){//如果有数据：true
         //4.写出【新跳蛙.mp3】每个字节
            desc.write(temp);//读入temp数据写出write中


        }
        long end=System.currentTimeMillis();//获取系统时间：毫秒数
        //6.关闭流
        src.close();desc.close();
        //7.读取花费时间
        System.out.println("读取花费时间"+(end-start)/1000+"秒数");

    }


    //需求:实现视频C V 复制粘贴
    /**
     * 读写按照1个字节操作---效率低
     *
     * 1024  程序员节
     * 1字节=8位二进制
     * 0   0000 0000
     * 1   0000 0001
     * 2   0000 0010
     * 6   0000 0110
     * 1024字节=1KB
     * 1024KB=1MB
     * 1024MB=1G
     * 1024G=1T
     * 读写按照 100KB 操作---效率低
     */
    @Test
    public void testRW() throws IOException {
        //1.被复制的文件---视频--占用内存空间大
        RandomAccessFile src=new RandomAccessFile("大学生讲思政课.mp4","r");
        //1.复制的文件---视频.mp4
        RandomAccessFile desc=new RandomAccessFile("大学生讲思政课复制品.mp4","rw");
        //2.保存每次读取的字节量
        int len=-1;
        /**
         * read()  一个字节一个字节读
         * read(字节数组)   实现根据自己指定的 100KB  方式读取字节
         */
        //3.定义字节数组----100KB
        byte[] date=new byte[1024*100];
        //4.开始从“大学生讲思政课.mp4” 读取
//(len=src.read(data))!=-1   判断条件
        while((len=src.read(date))!=-1){
            /**重载
             * write()  写出一个字节
             * write(字节数组，读取开始位：0，读取结束：-1)
             * 作用：写出“字节数组：指定大小 100KB的文件，从0开始，写出到-1结束
             */
            //5.按照100KB   写出“视频.mp4”文件
            desc.write(date,0,len);
            //6.关闭流
            //7.自己测复制时间
    }
}
}
